/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */
package com.yami.shop.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yami.shop.bean.app.dto.SkuDto;
import com.yami.shop.bean.model.Sku;
import com.yami.shop.bean.model.StockBillLog;
import com.yami.shop.bean.model.StockBillLogItem;
import com.yami.shop.bean.param.ProductParam;
import com.yami.shop.bean.param.SkuExportParam;
import com.yami.shop.common.util.PageParam;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author yami
 */
public interface SkuMapper extends BaseMapper<Sku> {

    /**
     * 获取商品的sku列表 (不包含库存信息)
     *
     * @param prodId 商品id
     * @return sku列表
     */
    List<Sku> listByProdId(@Param("prodId") Long prodId);

    /**
     * 根据id获取sku语言列表
     *
     * @param skuId
     * @return
     */
    Sku getSkuListBySkuId(@Param("skuId") Long skuId);


    /**
     * 删除商品
     *
     * @param prodId 商品id
     */
    void deleteByProdId(@Param("prodId") Long prodId);

    /**
     * 批量新增sku并且返回自增主键
     *
     * @param skuList sku列表
     */
    void insertBatchReturnId(@Param("skuList") List<Sku> skuList);

    /**
     * 获取sku 不用语言条件下
     *
     * @param skuId  skuId
     * @param dbLang 语言表
     * @return
     */
    Sku getSkuBySkuId(@Param("skuId") Long skuId, @Param("dbLang") Integer dbLang);

    /**
     * 根据skuId列表查找库存信息，赠品使用无缓存
     *
     * @param skuIds
     * @return
     */
    List<Sku> getSkuBySkuIds(@Param("skuIds") List<Long> skuIds);

    /**
     * 根据商品id列表获取有商品编号的
     *
     * @param prodIds   获取商品编号的商品id列表
     * @param disProdId 过滤掉的商品
     * @return
     */
    List<String> listSkuByProdIds(@Param("prodIds") List<Long> prodIds, @Param("disProdId") Long disProdId);

    /**
     * 根据商品id获取sku列表
     *
     * @param prodId
     * @param lang
     * @return
     */
    List<Sku> listSkuByProdIdAndLang(@Param("prodId") Long prodId, @Param("lang") Integer lang);

    /**
     * 分页获取sku
     *
     * @param page
     * @param product
     * @return
     */
    IPage<Sku> pageSku(@Param("page") PageParam<Sku> page, @Param("product") ProductParam product);

    /**
     * 根据编码获取sku信息
     *
     * @param shopId
     * @param lang
     * @param partyCode
     * @return
     */
    Sku getSkuByPartyCode(@Param("shopId") Long shopId, @Param("partyCode") String partyCode, @Param("lang") Integer lang);

    /**
     * 更新sku,该方法不更新库存
     *
     * @param sku
     */
    void updateSkuById(@Param("sku") Sku sku);

    /**
     * 查询库存
     *
     * @param page
     * @param productParam
     * @param lang
     * @return
     */
    IPage<StockBillLogItem> inquireStock(@Param("page") PageParam<StockBillLog> page, @Param("productParam") ProductParam productParam, @Param("lang") Integer lang);

    /**
     * 获取导出sku列表
     *
     * @param product
     * @param lang
     * @return
     */
    List<SkuExportParam> listExportSku(@Param("product") ProductParam product, @Param("lang") Integer lang);

    /**
     * 获取指定商品的sku列表（包括sku库存信息等）（仅获取启用状态）
     *
     * @param prodId
     * @param lang
     * @return
     */
    List<SkuDto> getProdDetailSkuInfo(@Param("prodId") Long prodId, @Param("lang") Integer lang);

    /**
     * 根据商品id和团购价格获取对应sku的原价
     *
     * @param prodId
     * @param actPrice
     * @return
     */
    Sku getSkuOriPriceByProdIdAndActPrice(@Param("prodId") Long prodId, @Param("actPrice") Double actPrice);

    /**
     * 或者指定的sku列表
     *
     * @param skuIds
     * @return
     */
    List<Sku> listSkuBySKuIds(@Param("skuIds") List<Long> skuIds);
}
